package br.com.ava.core.entrada;

import java.util.ArrayList;
import java.util.List;

import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;

import br.com.ava.core.ConstantesMensagens;
import br.com.ava.core.funcionario.FuncionarioMediator;
import br.com.ava.core.infra.excecao.NegocioException;
import br.com.ava.core.infra.mensagem.Mensagem;
import br.com.ava.core.infra.persistencia.AbstractMediator;
import br.com.ava.core.produto.ProdutoMediator;

@SuppressWarnings("serial")
public class EntradaProdutoMediator extends AbstractMediator<EntradaProduto> {

	private EntradaProdutoDAO dao;
	private ItemEntradaDAO itemEntradaDAO;
	private ProdutoMediator produtoMediator;
	private FuncionarioMediator funcionarioMediator;

	@Override
	protected void validarInclusao(EntradaProduto entradaProduto)
			throws NegocioException {
		super.validarInclusao(entradaProduto);
		validarCamposObrigatorios(entradaProduto);
	}

	private void validarCamposObrigatorios(EntradaProduto entradaProduto) {
		List<Mensagem> mensagens = entradaProduto.validar();

		if (entradaProduto.getData() == null) {
			mensagens.add(new Mensagem(
					ConstantesMensagens.MSG_ERRO_CAMPO_OBRIGATORIO, "Data"));
		}

		if (!mensagens.isEmpty()) {
			throw new NegocioException(mensagens);
		}
	}

	@Transactional(isolation = Isolation.DEFAULT, rollbackFor = Exception.class)
	public void entrada(EntradaProduto entradaProduto, Integer idFuncionario) {
		entradaProduto
				.setFuncionario(funcionarioMediator.buscar(idFuncionario));
		validarInclusao(entradaProduto);
		validarItensEntrada(entradaProduto.getItensEntrada());

		dao.salvar(entradaProduto);

		for (ItemEntrada itemEntrada : entradaProduto.getItensEntrada()) {
			itemEntrada.getProduto().setQuantestoque(
					itemEntrada.getProduto().getQuantestoque()
							+ itemEntrada.getQuantidade());
			produtoMediator.alterar(itemEntrada.getProduto());
			itemEntradaDAO.salvar(itemEntrada);
		}

	}

	public void validarItensEntrada(List<ItemEntrada> itens) {

		List<Mensagem> mensagens = new ArrayList<Mensagem>();

		if (itens.isEmpty()) {
			mensagens.add(new Mensagem(
					ConstantesMensagens.MSG_ERRO_ENTRADA_SEM_ITEM));
		} else {
			for (ItemEntrada itemEntrada : itens) {
				validarItemEntrada(itemEntrada);
			}
		}

		if (!mensagens.isEmpty()) {
			throw new NegocioException(mensagens);
		}
	}

	private void validarItemEntrada(ItemEntrada itemEntrada) {
		List<Mensagem> mensagens = itemEntrada.validar();

		if (itemEntrada.getQuantidade() == 0) {
			mensagens.add(new Mensagem(
					ConstantesMensagens.MSG_ERRO_CAMPO_OBRIGATORIO,
					"Quantidade"));
		}

		if (itemEntrada.getValorcompra() == 0) {
			mensagens.add(new Mensagem(
					ConstantesMensagens.MSG_ERRO_CAMPO_OBRIGATORIO,
					"Valor Compra"));
		}

		if (!mensagens.isEmpty()) {
			throw new NegocioException(mensagens);
		}
	}

	@Override
	protected EntradaProdutoDAO getDao() {
		return dao;
	}

	public void setDao(EntradaProdutoDAO dao) {
		this.dao = dao;
	}

	public ItemEntradaDAO getItemEntradaDAO() {
		return itemEntradaDAO;
	}

	public void setItemEntradaDAO(ItemEntradaDAO itemEntradaDAO) {
		this.itemEntradaDAO = itemEntradaDAO;
	}

	public ProdutoMediator getProdutoMediator() {
		return produtoMediator;
	}

	public void setProdutoMediator(ProdutoMediator produtoMediator) {
		this.produtoMediator = produtoMediator;
	}

	public FuncionarioMediator getFuncionarioMediator() {
		return funcionarioMediator;
	}

	public void setFuncionarioMediator(FuncionarioMediator funcionarioMediator) {
		this.funcionarioMediator = funcionarioMediator;
	}

}
